package com.fqgj.xjd.user.client;


import com.fqgj.common.api.Response;
import com.fqgj.xjd.user.client.enums.AppCodeEnum;
import com.fqgj.xjd.user.client.enums.FrozenCodeEnum;
import com.fqgj.xjd.user.client.enums.ThirdPartLoginTypeEnum;
import com.fqgj.xjd.user.client.enums.UserTypeEnum;
import com.fqgj.xjd.user.client.request.*;
import com.fqgj.xjd.user.client.response.*;
import com.qianli.common.enums.AppEnum;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @ClassName:
 * @Description: 客户基础服务
 * @Author zhangxingyun
 * @Create 2017-07-21 09:37
 */
public interface UserService {

    /**
     * 用户注册
     *
     * @param userAccess
     * @param appCode
     * @return
     */
    Response<UserAccessInfo> userRegister(UserAccess userAccess, String appCode);


    /**
     * 用户注册
     *
     * @param userAccess
     * @param appCodeEnum 必须
     *                    todo 1.检查手机号是否存在需要通过access_token表检查，而不是user表 2.不需要创建user(认证成功后才创建user)
     *                    todo 已经完成，等待测试
     */
    Response<UserAccessInfo> register(UserAccess userAccess, AppCodeEnum appCodeEnum);


    /**
     * @param loginTypeEnum 三方登陆类型
     * @param requestMap    提交的参数
     * @return
     */
    Response<UserAccessInfo> thirdPartLogin(ThirdPartLoginTypeEnum loginTypeEnum, Map requestMap, AppEnum appEnum);


    /**
     * 密码登录
     *
     * @param userAccess
     * @param appCodeEnum 必须
     *                    todo 1.不需要检查user 2.通过手机号,appCode在access_token查询用户
     *                    todo 已经完成，等待测试
     */
    Response<UserAccessInfo> passwordLogin(UserAccess userAccess, AppCodeEnum appCodeEnum);

    /**
     * 密码登录
     *
     * @param userAccess
     * @param appCode
     * @return
     */
    Response<UserAccessInfo> passwordLogin(UserAccess userAccess, String appCode);


    /**
     * 验证码登录
     *
     * @param userAccess
     * @param appCode
     * @return
     */
    Response<UserAccessInfo> verifyCodeLogin(UserAccess userAccess, String appCode);

    /**
     * 验证码登录 新版
     *
     * @param userAccess
     * @param appEnum
     * @return
     */
    Response<UserAccessInfo> verifyCodeLogin(UserAccess userAccess, AppEnum appEnum);

    /**
     * 验证码登录 新版
     *
     * @param userAccess
     * @param appEnum
     * @param needRefreshToken 是否需要刷新Token
     * @return
     */
    Response<UserAccessInfo> verifyCodeLogin(UserAccess userAccess, AppEnum appEnum, Boolean needRefreshToken);

    /**
     * 设置密码
     *
     * @param userAccess todo 1.通过手机号,appCode在access_token查询用户 2.不需要appCodeEnum
     *                   TODO 已经完成，等待测试
     */
    Response<Boolean> setPassword(UserAccess userAccess);


    /**
     * 更新密码
     *
     * @param userAccess todo 1.不需要appCodeEnum
     *                   todo 已经完成，等待测试
     */
    Response<Boolean> updatePassword(UserAccess userAccess);


    /**
     * 冻结用户
     *
     * @param userCode
     * @param frozeCodeEnum todo 1.修改user获取方式
     *                      todo 已经完成，等待测试
     */
    Response<Boolean> frozenUser(String userCode, FrozenCodeEnum frozeCodeEnum);


    Response<Boolean> frozenUser(String userCode, FrozenCodeEnum frozeCodeEnum, String categoryCode);

    /**
     * 借款被拒冷冻（迁数据）
     *
     * @param userCode
     * @param categoryCode
     * @param gmtDate
     * @return
     */
    @Deprecated
    Response<Boolean> borrowFrozenUser(String userCode, String categoryCode, Date gmtDate);

    /**
     * 解冻用户
     *
     * @param userCode
     * @param frozeCodeEnum todo 1.修改user获取方式
     *                      TODO 已经完成，等待测试
     */
    Response<Boolean> unFrozenUser(String userCode, FrozenCodeEnum frozeCodeEnum);


    Response<Boolean> unFrozenUser(String userCode, FrozenCodeEnum frozeCodeEnum, String categoryCode);

    /**
     * 获取用户基本信息
     *
     * @param userCode
     */
    Response<User> getUserByUserCode(String userCode);

    /**
     * 根据手机号和appCode查询用户
     */
    Response<User> getUserByMobile(String mobile, String appCode);

    /**
     * 根据手机号查询用户
     * @param mobile
     * @return
     */
    Response<User> getUserByMobile(String mobile);

    /**
     * 根据手机号和appCode查询基本用户信息
     *
     * @param mobile
     * @param appCode
     * @return
     */
    Response<UserAccessInfo> getUserAccessInfoByMobile(String mobile, String appCode);

    /**
     * 根据MD5手机号和appCode查询基本用户信息
     *
     * @param md5Mobile
     * @param appCode
     * @return
     */
    Response<UserAccessInfo> getUserAccessInfoByMD5Mobile(String md5Mobile, String appCode);

    /**
     * 根据userCode查询UserAccess
     *
     * @param userCode
     * @return
     */
    Response<UserAccessInfo> getUserAccessInfoByUserCode(String userCode);

    /**
     * 根据mobile查询UserAccessList
     *
     * @param userAccessQueryRequest
     * @return
     */
    Response<List<UserAccessInfo>> getUserAccessInfoListByMobile(UserAccessQueryRequest userAccessQueryRequest);

    /**
     * @param mobile
     * @return
     */
    Response<Customer> getCustomerByMobile(String mobile);

    /**
     * 根据MD5加密手机号查询客户信息
     *
     * @param md5Mobile
     * @return
     */
    Response<Customer> getCustomerByMD5Mobile(String md5Mobile);

    /**
     * 根据MD5加密（手机号+addhaar）查询客户信息
     *
     * @param md5MobileIdNo
     * @return
     */
    Response<Customer> getCustomerByMD5MobileIdNo(String md5MobileIdNo);


    /**
     * 根据手机号列表和appCode查询用户
     *
     * @param mobiles
     * @param appCodeEnum
     * @return
     */
    Response<List<User>> getUserListByMobileList(List<String> mobiles, AppCodeEnum appCodeEnum, List<String> categories);

    /**
     * 根据身份证获取用户  -->cashmama对应的是 aadhaar
     *
     * @param identityNo
     * @return todo 1.修改返回类型
     * todo 已经完成，等待测试
     */
    Response<Customer> getCustomerByIdentityNo(String identityNo);


    Response<Customer> getCustomerByIdentityNoAndCategories(String identityNo, List<String> categories);

    /**
     * @param userCodes
     * @return
     */
    Response<List<UserCategory>> getCategoriesListByUserCode(List<String> userCodes);


    /**
     * @param mobile
     * @return
     */
    Response<Customer> getCustomerByMobileAndCategories(String mobile, List<String> categories);


    /***
     * 根据姓名查找用户， %姓名
     * @param namePrefix
     * @return
     * todo 1.根据姓名查找客户
     * todo 已经完成，等待测试，需要和兴运最终确定customer是否需要手机号
     */
    Response<List<Customer>> searchUserByName(String namePrefix);

    /**
     * 更新用户身份
     *
     * @param customerCode
     * @param userTypeEnum
     * @return todo 1.userCode应为customerCode
     */
    Response<Boolean> updateUserType(String customerCode, UserTypeEnum userTypeEnum);


    /**
     * 保存用户头像
     *
     * @param userCode
     * @param avatar
     * @return todo 1.不需要appCodeEnum
     * todo 已经完成，等待测试
     */
    Response<Boolean> updateUserAvatar(String userCode, String avatar, String nickname);


    /**
     * 获取用户登录基本信息
     *
     * @param userCode
     * @return todo 1.不需要appCodeEnum
     * TODO 已经完成，等待测试
     */
    Response<UserLoginInfo> getUserLoginInfo(String userCode);


    /**
     * 根据token获取
     *
     * @param token
     * @return
     */
    Response<UserLoginInfo> getUserLoginInfoByToken(String token);


    /**
     * @param userCode
     * @return todo 1.不需要appCodeEnum
     * todo 已经完成，等待测试
     */
    Response<UserBehaviorRegister> getRegisterInfo(String userCode);

    /**
     * 适用于数据迁移,根据用户的userId获取用户的列表
     *
     * @param userIdList
     * @return
     */
    @Deprecated
    Response<List<User>> getUserByUserIdList(List<Long> userIdList);

    /**
     * @param userCodeList
     * @return
     */
    Response<List<User>> getUserByUserCodeList(List<String> userCodeList);


    /**
     * 按条件查询用户（分页）
     *
     * @param condition
     * @return
     */
    Response<UserList> queryUserByCondition(UserBaseCondition condition);

    /**
     * 生成userCode
     *
     * @param mobile
     * @return
     */
    Response<String> produceUserCodeByMobile(String mobile);

    /**
     * @param loginTypeEnum
     * @param openId
     * @param newMobile
     * @return
     */
    Response<String> updateUserMobileByOpenId(ThirdPartLoginTypeEnum loginTypeEnum, String openId, String newMobile);

    /**
     * 获取openId
     *
     * @param userCode
     * @return
     */
    Response<String> getOpenIdByUserCode(String userCode);

    /**
     * 保存实名认证信息（user）
     *
     * @param request
     * @return
     */
    Response<Boolean> insertUserAuthentication(UserAuthenticationRequest request);

    /**
     * 复制用户
     *
     * @param request
     * @return
     */
    Response<CopyUserVO> copyUser(CopyUserRequest request);

    Response<UserLiveRes> getUserLiveRes(String userCode);

    Response<Boolean> addUserLiveRes(UserLiveRes userLiveRes);
    Response<Boolean> addPromotion(UserProductPromotionLogRes userProductPromotionLogRes);

}
